// main.cpp - HarmonyOS真机版本
// ⚠️ 注意：HarmonyOS 真机上必须使用 qtmain() 而不是 main()！
// Qt 应用作为共享库加载，生命周期由 HarmonyOS 管理

#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QQmlError>
#include <QSurfaceFormat>
#include <QtQml>
#include <QDebug>
#include <QGuiApplication>
#include <QCoreApplication>
#include <QOpenGLContext>
#include <QQuickWindow>
#include <QQuickItem>
#include <QColor>

// 全局对象实例（静态变量，确保生命周期）
static QQmlApplicationEngine *g_engine = nullptr;

// HarmonyOS真机入口点：使用 int qtmain(int argc, char **argv)
extern "C" int qtmain(int argc, char **argv)
{
    // 防止重复初始化
    if (g_engine != nullptr) {
        qDebug() << "ListWidget Qt引擎已初始化，跳过重复初始化";
        return 0;
    }
    
    qDebug() << "=== ListWidget Qt Application Starting (HarmonyOS真机版本) ===";
    
    // ========================================
    // Step 1: 配置 OpenGL ES 表面格式（⚠️ 必须在创建应用之前！）
    // ========================================
    QSurfaceFormat format;
    
    // 设置 Alpha 通道（透明度）
    format.setAlphaBufferSize(8);      // 8 位 Alpha 通道
    
    // 设置颜色通道（RGBA 32 位真彩色）
    format.setRedBufferSize(8);        // 8 位红色通道
    format.setGreenBufferSize(8);      // 8 位绿色通道
    format.setBlueBufferSize(8);       // 8 位蓝色通道
    
    // 设置深度和模板缓冲区
    format.setDepthBufferSize(24);     // 24 位深度缓冲
    format.setStencilBufferSize(8);    // 8 位模板缓冲
    
    // 指定渲染类型为 OpenGL ES（HarmonyOS要求）
    format.setRenderableType(QSurfaceFormat::OpenGLES);
    
    // 指定 OpenGL ES 版本为 3.0（根据文档推荐）
    format.setVersion(3, 0);
    
    // 其他配置
    format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
    format.setSamples(0);
    
    // ⚠️ 关键：必须在创建 QGuiApplication 之前设置默认格式！
    QSurfaceFormat::setDefaultFormat(format);
    
    qDebug() << "ListWidget OpenGL ES 表面格式已配置";
    qDebug() << "  Version: OpenGL ES" << format.majorVersion() << "." << format.minorVersion();
    qDebug() << "  RGBA: 8-8-8-8";
    qDebug() << "  Depth: 24 bits";
    qDebug() << "  Stencil: 8 bits";
    
    // ========================================
    // Step 2: 创建 Qt 应用实例（必须在设置格式之后）
    // ========================================
    // HarmonyOS平台：设置使用 OpenGL ES，并共享上下文
    QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
    QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
    
    qputenv("QSG_INFO", "1");  // 保留调试信息
    
    // ⚠️ 重要：真机版本也需要创建 QGuiApplication！
    QGuiApplication app(argc, argv);
    QCoreApplication::setApplicationName(QStringLiteral("ListWidget"));
    QCoreApplication::setOrganizationName(QStringLiteral("Example"));
    QCoreApplication::setOrganizationDomain(QStringLiteral("example.com"));
    
    // 验证配置是否生效
    QSurfaceFormat actualFormat = QSurfaceFormat::defaultFormat();
    qDebug() << "ListWidget 验证实际配置:";
    qDebug() << "  Alpha buffer size:" << actualFormat.alphaBufferSize();
    qDebug() << "  Depth buffer size:" << actualFormat.depthBufferSize();
    qDebug() << "  Renderable type:" << (actualFormat.renderableType() == QSurfaceFormat::OpenGLES ? "OpenGL ES" : "OpenGL");
    
    // ========================================
    // Step 3: 创建并配置 QML 引擎
    // ========================================
    g_engine = new QQmlApplicationEngine();
    
    // 连接QML错误信号以便调试
    QObject::connect(g_engine, &QQmlApplicationEngine::warnings, [](const QList<QQmlError> &warnings) {
        for (const auto &warning : warnings) {
            qWarning() << "ListWidget QML警告:" << warning.toString();
            qWarning() << "  URL:" << warning.url();
            qWarning() << "  行号:" << warning.line();
            qWarning() << "  列号:" << warning.column();
            qWarning() << "  消息:" << warning.description();
        }
    });
    
    // 添加组件搜索路径（确保能找到 components 目录下的组件）
    g_engine->addImportPath(QStringLiteral("qrc:/"));
    g_engine->addImportPath(QStringLiteral("qrc:/qml"));
    
    // 加载 QML 文件
    qDebug() << "ListWidget 加载QML文件: qrc:/main.qml";
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    
    // 连接QML对象创建信号，确保正确初始化
    QObject::connect(g_engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl) {
            qCritical() << "ListWidget QML对象创建失败，URL:" << objUrl.toString();
            QCoreApplication::exit(-1);
        } else if (obj) {
            qDebug() << "ListWidget QML对象创建成功，类型:" << obj->metaObject()->className();
        }
    }, Qt::QueuedConnection);
    
    g_engine->load(url);
    
    // 检查加载结果
    if (g_engine->rootObjects().isEmpty()) {
        qWarning() << "ListWidget ERROR: Failed to load QML file!";
        
        // 最稳妥兜底：若加载失败，展示内置应急界面，避免纯白屏
        static const char fallbackQml[] =
            "import QtQuick 2.15\n"
            "Rectangle {\n"
            "  anchors.fill: parent\n"
            "  color: \"#FF0000\"\n"
            "  Text { anchors.centerIn: parent; color: \"white\"; text: \"QML加载失败\"; font.pixelSize: 20 }\n"
            "}\n";
        g_engine->loadData(QByteArray(fallbackQml), QUrl(QStringLiteral("qrc:/fallback.qml")));
        if (g_engine->rootObjects().isEmpty()) {
            qCritical() << "ListWidget Fallback UI also failed to load. Exiting.";
            return -1;
        }
    } else {
        qDebug() << "ListWidget QML文件加载成功";
        
        // 验证表面格式
        QSurfaceFormat actualFormat = QSurfaceFormat::defaultFormat();
        qDebug() << "ListWidget 验证实际配置:";
        qDebug() << "  实际 Alpha buffer size:" << actualFormat.alphaBufferSize();
        qDebug() << "  实际 Depth buffer size:" << actualFormat.depthBufferSize();
        qDebug() << "  实际 Renderable type:" << (actualFormat.renderableType() == QSurfaceFormat::OpenGLES ? "OpenGL ES" : "OpenGL");
        
        // 获取根对象并检查
        QList<QObject*> rootObjects = g_engine->rootObjects();
        qDebug() << "ListWidget 根对象数量:" << rootObjects.size();
        for (int i = 0; i < rootObjects.size(); ++i) {
            QObject* obj = rootObjects[i];
            qDebug() << "ListWidget 根对象" << i << "类型:" << obj->metaObject()->className();
            // 如果是QQuickWindow，设置窗口属性
            QQuickWindow* window = qobject_cast<QQuickWindow*>(obj);
            if (window) {
                qDebug() << "ListWidget 找到QQuickWindow，设置窗口属性";
                window->setColor(QColor("#F5F5F5"));  // 设置为与QML背景色一致
                
                // ⚠️ 关键：确保窗口激活并获得焦点，这样才能接收事件
                window->show();  // 确保窗口显示
                window->raise(); // 将窗口提升到最前
                window->requestActivate(); // 请求激活窗口
                
                qDebug() << "ListWidget 窗口已激活，isActive:" << window->isActive();
            }
            
            // 如果是ApplicationWindow，也需要确保激活
            QQuickItem* item = qobject_cast<QQuickItem*>(obj);
            if (item) {
                qDebug() << "ListWidget 找到QQuickItem，确保可以获得焦点";
                item->setFocus(true);  // 设置焦点
                item->forceActiveFocus(); // 强制获得焦点
            }
        }
    }
    
    qDebug() << "=== ListWidget Qt Application Started ===";
    
    // ⚠️ 重要：真机版本也需要进入事件循环！
    // HarmonyOS 会管理应用生命周期，但 Qt 事件循环仍然需要运行
    return app.exec();
}

// 提供一个前向到 qtmain() 的适配，以兼容不同加载策略
extern "C" int main(int argc, char **argv)
{
    return qtmain(argc, argv);
}
